package array.sliding_window;
/*      给定一个含有 n 个正整数的数组和一个正整数 target 。
        找出该数组中满足其总和大于等于 target 的长度最小的 连续
        子数组
        [numsl, numsl+1, ..., numsr-1, numsr] ，并返回其长度。如果不存在符合条件的子数组，返回 0 。


        示例 1：
        输入：target = 7, nums = [2,3,1,2,4,3]
        输出：2
        解释：子数组 [4,3] 是该条件下的长度最小的子数组。

        示例 2：
        输入：target = 4, nums = [1,4,4]
        输出：1

        示例 3：
        输入：target = 11, nums = [1,1,1,1,1,1,1,1]
        输出：0*/
public class lc209 {
    public static void main(String[] args) {
        int[] nums=new int[]{5,1,3,5,10,7,4,9,2,8};
        System.out.println(minSubArrayLen2( 15,nums));

    }
    public static void minSubArrayLen1(int target, int[] nums) {
        //暴力解法：双重for循环，一个控制起点，另一个控制终点

    }
    public static int minSubArrayLen2(int target, int[] nums) {
        //将双重循环改为单层循环来减少复杂度,也是一种变相的双指针
        int right=0;
        int left=0;
        int cur_result=0;
        int bestresult=0;
        while(right<nums.length){
            cur_result+=nums[right];
            while(cur_result>=target){
                if(right-left+1<bestresult||bestresult==0)
                    bestresult=right-left+1;
                cur_result-=nums[left];
                left++;
            }
            right++;
        }
        return bestresult;

    }
}
